widget: Save pointer to focus child
authorTimm Bäder <mail@baedert.org>
Wed, 8 Feb 2017 08:00:29 +0000 (09:00 +0100)
committerTimm Bäder <mail@baedert.org>
Fri, 31 Mar 2017 07:50:39 +0000 (09:50 +0200)
Do the same thing GtkContainer does.

14 files changed:
gtk/gtkcontainer.c
gtk/gtkexpander.c
gtk/gtkflowbox.c
gtk/gtklistbox.c
gtk/gtknotebook.c
gtk/gtkpaned.c
gtk/gtkpopover.c
gtk/gtkscrolledwindow.c
gtk/gtktextview.c
gtk/gtktoolbar.c
gtk/gtktreeview.c
gtk/gtkwidget.c
gtk/gtkwidgetprivate.h
gtk/gtkwindow.c

index 8968983886d940e3fea02ecac689207e0d30510a..206589248de18c41fa63f1e0b96489b822e67121 100644 (file)
@@ -2114,10 +2114,9 @@ gtk_container_real_set_focus_child (GtkContainer     *container,
         {
 
           focus_child = priv->focus_child;
-          while (GTK_IS_CONTAINER (focus_child) && gtk_container_get_focus_child (GTK_CONTAINER (focus_child)))
-            {
-              focus_child = gtk_container_get_focus_child (GTK_CONTAINER (focus_child));
-            }
+
+          while (gtk_widget_get_focus_child (focus_child))
+            focus_child = gtk_widget_get_focus_child (focus_child);
 
           gtk_widget_translate_coordinates (focus_child, priv->focus_child,
                                             0, 0, &x, &y);
@@ -2310,7 +2309,7 @@ find_old_focus (GtkContainer *container,
 
           parent = _gtk_widget_get_parent (widget);
 
-          if (parent && (gtk_container_get_focus_child (GTK_CONTAINER (parent)) != widget))
+          if (parent && (gtk_widget_get_focus_child (parent) != widget))
             goto next;
 
           widget = parent;
index d17d2c5dde9a1d7af7dd21a7168cba1ed86b90b0..a2aad912c9315f10abd9056756188b6101bd20ac 100644 (file)
@@ -796,7 +796,7 @@ focus_current_site (GtkExpander      *expander,
 {
   GtkWidget *current_focus;
 
-  current_focus = gtk_container_get_focus_child (GTK_CONTAINER (expander));
+  current_focus = gtk_widget_get_focus_child (GTK_WIDGET (expander));
 
   if (!current_focus)
     return FALSE;
@@ -962,7 +962,7 @@ gtk_expander_focus (GtkWidget        *widget,
       FocusSite site = FOCUS_NONE;
 
       widget_is_focus = gtk_widget_is_focus (widget);
-      old_focus_child = gtk_container_get_focus_child (GTK_CONTAINER (widget));
+      old_focus_child = gtk_widget_get_focus_child (GTK_WIDGET (widget));
 
       if (old_focus_child && old_focus_child == expander->priv->label_widget)
         site = FOCUS_LABEL;
index 6bb31a06217a8016035ce8731790cb0ae20ce115..d443047c96d1ad0f368813787f813467aeae4a33 100644 (file)
@@ -342,7 +342,7 @@ gtk_flow_box_child_focus (GtkWidget        *widget,
 
       return FALSE;
     }
-  else if (gtk_container_get_focus_child (GTK_CONTAINER (widget)) != NULL)
+  else if (gtk_widget_get_focus_child (widget) != NULL)
     {
       /* Child has focus, always navigate inside it first */
       if (gtk_widget_child_focus (child, direction))
@@ -3188,7 +3188,7 @@ gtk_flow_box_focus (GtkWidget        *widget,
       return GTK_WIDGET_CLASS (gtk_flow_box_parent_class)->focus (widget, direction);
     }
 
-  focus_child = gtk_container_get_focus_child (GTK_CONTAINER (box));
+  focus_child = gtk_widget_get_focus_child (widget);
   next_focus_child = NULL;
 
   if (focus_child != NULL)
index e3325d73a21e257325f5280b60ff8a9958d87e8d..31cfc45d818351dd126413c24e1ed1bb6e1f0b1c 100644 (file)
@@ -2016,7 +2016,7 @@ gtk_list_box_focus (GtkWidget        *widget,
   GtkWidget *row;
   GtkWidget *header;
 
-  focus_child = gtk_container_get_focus_child ((GtkContainer *)box);
+  focus_child = gtk_widget_get_focus_child (widget);
 
   next_focus_row = NULL;
   if (focus_child != NULL)
@@ -3207,7 +3207,7 @@ gtk_list_box_row_focus (GtkWidget        *widget,
 
       return FALSE;
     }
-  else if (gtk_container_get_focus_child (GTK_CONTAINER (row)) != NULL)
+  else if (gtk_widget_get_focus_child (widget) != NULL)
     {
       /* Child has focus, always navigate inside it first */
       if (gtk_widget_child_focus (child, direction))
index 566f481deb27e59cec9e2353218d69769b1fd807..707bec6537ee100dccb64510c80b092fbd230a8d 100644 (file)
@@ -1436,7 +1436,7 @@ gtk_notebook_move_focus_out (GtkNotebook      *notebook,
   GtkDirectionType effective_direction = get_effective_direction (notebook, direction_type);
   GtkWidget *toplevel;
 
-  if (gtk_container_get_focus_child (GTK_CONTAINER (notebook)) && effective_direction == GTK_DIR_UP)
+  if (gtk_widget_get_focus_child (GTK_WIDGET (notebook)) && effective_direction == GTK_DIR_UP)
     if (focus_tabs_in (notebook))
       return;
   if (gtk_widget_is_focus (GTK_WIDGET (notebook)) && effective_direction == GTK_DIR_DOWN)
@@ -4180,9 +4180,6 @@ gtk_notebook_focus (GtkWidget        *widget,
   gint last_action;
 
   gboolean widget_is_focus;
-  GtkContainer *container;
-
-  container = GTK_CONTAINER (widget);
 
   if (priv->tab_pos == GTK_POS_TOP ||
       priv->tab_pos == GTK_POS_LEFT)
@@ -4203,7 +4200,7 @@ gtk_notebook_focus (GtkWidget        *widget,
     }
 
   widget_is_focus = gtk_widget_is_focus (widget);
-  old_focus_child = gtk_container_get_focus_child (container);
+  old_focus_child = gtk_widget_get_focus_child (widget);
 
   effective_direction = get_effective_direction (notebook, direction);
 
index 23938478648eeb9cd8beef82b5db727d143f98b9..a17c9075c0ac89bff925f56e3fb09f32f7f8099c 100644 (file)
@@ -2449,7 +2449,7 @@ gtk_paned_set_focus_child (GtkContainer *container,
            if (GTK_IS_PANED (w))
              last_focus = w;
 
-          container_focus_child = gtk_container_get_focus_child (container);
+          container_focus_child = gtk_widget_get_focus_child (GTK_WIDGET (container));
           if (container_focus_child == priv->child1)
            gtk_paned_set_last_child1_focus (paned, last_focus);
          else if (container_focus_child == priv->child2)
@@ -2467,7 +2467,6 @@ gtk_paned_get_cycle_chain (GtkPaned          *paned,
                           GList            **widgets)
 {
   GtkPanedPrivate *priv = paned->priv;
-  GtkContainer *container = GTK_CONTAINER (paned);
   GtkWidget *ancestor = NULL;
   GtkWidget *focus_child;
   GtkWidget *parent;
@@ -2504,7 +2503,7 @@ gtk_paned_get_cycle_chain (GtkPaned          *paned,
    * priv->last_child?_focus before priv->child?, both when we
    * are going forward and backward.
    */
-  focus_child = gtk_container_get_focus_child (container);
+  focus_child = gtk_widget_get_focus_child (GTK_WIDGET (paned));
   if (direction == GTK_DIR_TAB_FORWARD)
     {
       if (focus_child == priv->child1)
@@ -2880,14 +2879,13 @@ gtk_paned_cycle_handle_focus (GtkPaned *paned,
     }
   else
     {
-      GtkContainer *container = GTK_CONTAINER (paned);
       GtkPaned *focus;
       GtkPaned *first;
       GtkWidget *toplevel;
       GtkWidget *focus_child;
 
       gtk_paned_find_neighbours (paned, &next, &prev);
-      focus_child = gtk_container_get_focus_child (container);
+      focus_child = gtk_widget_get_focus_child (GTK_WIDGET (paned));
 
       if (focus_child == priv->child1)
        {
index 94311abb5e9d38e76dd29c2a0f06ba063c8d9d53..6c72402cb538ca1dbdc5f17f20fba6889eeaa018 100644 (file)
@@ -1511,7 +1511,7 @@ gtk_popover_focus (GtkWidget        *widget,
        */
       while (focus && focus != widget)
         {
-          gtk_container_set_focus_child (GTK_CONTAINER (focus), NULL);
+          gtk_widget_set_focus_child (focus, NULL);
           focus = gtk_widget_get_parent (focus);
         }
 
index 255c776f978cc2835e6f6413f1955903e8762539..be15ef30fd64b563077b7469aee5357555d53e91 100644 (file)
@@ -3630,7 +3630,7 @@ gtk_scrolled_window_focus (GtkWidget        *widget,
   GtkWidget *child;
   gboolean had_focus_child;
 
-  had_focus_child = gtk_container_get_focus_child (GTK_CONTAINER (widget)) != NULL;
+  had_focus_child = gtk_widget_get_focus_child (widget) != NULL;
 
   if (priv->focus_out)
     {
index 03fdf97fcfda34af9c4594d700539efdf709d984..6f4b4c8f75dff70a4c31cf1b6bee5e2bdd562b48 100644 (file)
@@ -5959,13 +5959,10 @@ static gboolean
 gtk_text_view_focus (GtkWidget        *widget,
                      GtkDirectionType  direction)
 {
-  GtkContainer *container;
   gboolean result;
 
-  container = GTK_CONTAINER (widget);
-
   if (!gtk_widget_is_focus (widget) &&
-      gtk_container_get_focus_child (container) == NULL)
+      gtk_widget_get_focus_child (widget) == NULL)
     {
       if (gtk_widget_get_can_focus (widget))
         {
index 2eb4e08fda1cfc6235d9707817cd375f0c04f11d..273493436ecf068ad63f96afbcad4c3675ae9b98 100644 (file)
@@ -1836,7 +1836,7 @@ gtk_toolbar_focus_home_or_end (GtkToolbar *toolbar,
     {
       GtkWidget *child = list->data;
 
-      if (gtk_container_get_focus_child (GTK_CONTAINER (toolbar)) == child)
+      if (gtk_widget_get_focus_child (GTK_WIDGET (toolbar)) == child)
        break;
       
       if (gtk_widget_get_mapped (child) && gtk_widget_child_focus (child, dir))
@@ -1856,13 +1856,12 @@ gtk_toolbar_move_focus (GtkWidget        *widget,
                        GtkDirectionType  dir)
 {
   GtkToolbar *toolbar = GTK_TOOLBAR (widget);
-  GtkContainer *container = GTK_CONTAINER (toolbar);
   GtkWidget *focus_child;
   GList *list;
   gboolean try_focus = FALSE;
   GList *children;
 
-  focus_child = gtk_container_get_focus_child (container);
+  focus_child = gtk_widget_get_focus_child (widget);
 
   if (focus_child && gtk_widget_child_focus (focus_child, dir))
     return;
@@ -1899,7 +1898,7 @@ gtk_toolbar_focus (GtkWidget        *widget,
    * arrow keys or Ctrl TAB (both of which are handled by the
    * gtk_toolbar_move_focus() keybinding function.
    */
-  if (gtk_container_get_focus_child (GTK_CONTAINER (widget)))
+  if (gtk_widget_get_focus_child (widget))
     return FALSE;
 
   children = gtk_toolbar_list_children_in_focus_order (toolbar, dir);
index d7de695501309f8ae73ede0b87e455b092162fd8..72c687e9ef7447b9ac940fcb3e69140456c1a0e5 100644 (file)
@@ -8294,7 +8294,7 @@ gtk_tree_view_header_focus (GtkTreeView      *tree_view,
   if (! tree_view->priv->headers_visible)
     return FALSE;
 
-  focus_child = gtk_container_get_focus_child (GTK_CONTAINER (tree_view));
+  focus_child = gtk_widget_get_focus_child (GTK_WIDGET (tree_view));
 
   first_column = tree_view->priv->columns;
   while (first_column)
@@ -8491,13 +8491,12 @@ gtk_tree_view_focus (GtkWidget        *widget,
                     GtkDirectionType  direction)
 {
   GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
-  GtkContainer *container = GTK_CONTAINER (widget);
   GtkWidget *focus_child;
 
   if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_can_focus (widget))
     return FALSE;
 
-  focus_child = gtk_container_get_focus_child (container);
+  focus_child = gtk_widget_get_focus_child (widget);
 
   gtk_tree_view_stop_editing (GTK_TREE_VIEW (widget), FALSE);
   /* Case 1.  Headers currently have focus. */
index 44359545b60b0817fdf56bc6c194e113e4baaffb..d7a9951db13ff2f3833a0ad761b7cdc1eb2ee948 100644 (file)
@@ -4011,11 +4011,8 @@ gtk_widget_unparent (GtkWidget *widget)
   if (_gtk_widget_is_toplevel (toplevel))
     _gtk_window_unset_focus_and_default (GTK_WINDOW (toplevel), widget);
 
-  if (GTK_IS_CONTAINER (priv->parent))
-    {
-      if (gtk_container_get_focus_child (GTK_CONTAINER (priv->parent)) == widget)
-        gtk_container_set_focus_child (GTK_CONTAINER (priv->parent), NULL);
-    }
+  if (gtk_widget_get_focus_child (priv->parent) == widget)
+    gtk_widget_set_focus_child (priv->parent, NULL);
 
   if (_gtk_widget_is_drawable (priv->parent))
     gtk_widget_queue_draw_area (priv->parent,
@@ -7154,12 +7151,9 @@ reset_focus_recurse (GtkWidget *widget,
 {
   if (GTK_IS_CONTAINER (widget))
     {
-      GtkContainer *container;
-
-      container = GTK_CONTAINER (widget);
-      gtk_container_set_focus_child (container, NULL);
+      gtk_widget_set_focus_child (widget, NULL);
 
-      gtk_container_foreach (container,
+      gtk_container_foreach (GTK_CONTAINER (widget),
                             reset_focus_recurse,
                             NULL);
     }
@@ -15744,6 +15738,8 @@ void
 gtk_widget_set_focus_child (GtkWidget *widget,
                             GtkWidget *child)
 {
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
   if (child != NULL)
@@ -15752,8 +15748,20 @@ gtk_widget_set_focus_child (GtkWidget *widget,
       g_return_if_fail (gtk_widget_get_parent (child) == widget);
     }
 
+  g_set_object (&priv->focus_child, child);
+
   if (GTK_IS_CONTAINER (widget))
     gtk_container_set_focus_child (GTK_CONTAINER (widget), child);
 
   /* TODO: ??? */
 }
+
+GtkWidget *
+gtk_widget_get_focus_child (GtkWidget *widget)
+{
+  GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
+
+  return priv->focus_child;
+}
index ba46211453892592dbd398efd17f0587d043e7d9..47239348f00fb38ceed000eed61e3be5ad1ef2a8 100644 (file)
@@ -158,6 +158,8 @@ struct _GtkWidgetPrivate
   GtkWidget *next_sibling;
   GtkWidget *first_child;
   GtkWidget *last_child;
+
+  GtkWidget *focus_child;
 };
 
 GtkCssNode *  gtk_widget_get_css_node       (GtkWidget *widget);
@@ -303,6 +305,8 @@ void              gtk_widget_forall                        (GtkWidget
                                                             GtkCallback           callback,
                                                             gpointer              user_data);
 
+GtkWidget        *gtk_widget_get_focus_child               (GtkWidget            *widget);
+
 /* inline getters */
 
 static inline gboolean
index 50fe2acec50d6ca6f7d60cf3022a4278a762d453..2cd55f286d36f08971e6b47f1d829ac337969454 100644 (file)
@@ -7977,7 +7977,7 @@ gtk_window_focus (GtkWidget        *widget,
   priv = window->priv;
   bin = GTK_BIN (widget);
 
-  old_focus_child = gtk_container_get_focus_child (container);
+  old_focus_child = gtk_widget_get_focus_child (widget);
 
   /* We need a special implementation here to deal properly with wrapping
    * around in the tab chain without the danger of going into an
@@ -8003,7 +8003,7 @@ gtk_window_focus (GtkWidget        *widget,
       parent = _gtk_widget_get_parent (priv->focus_widget);
       while (parent)
        {
-         gtk_container_set_focus_child (GTK_CONTAINER (parent), NULL);
+          gtk_widget_set_focus_child (parent, NULL);
          parent = _gtk_widget_get_parent (parent);
        }
       
@@ -8042,7 +8042,7 @@ gtk_window_move_focus (GtkWidget        *widget,
 
   gtk_widget_child_focus (widget, dir);
 
-  if (! gtk_container_get_focus_child (GTK_CONTAINER (widget)))
+  if (!gtk_widget_get_focus_child (widget))
     gtk_window_set_focus (GTK_WINDOW (widget), NULL);
 }
 
@@ -8208,7 +8208,7 @@ _gtk_window_unset_focus_and_default (GtkWindow *window,
   g_object_ref (widget);
 
   parent = _gtk_widget_get_parent (widget);
-  if (gtk_container_get_focus_child (GTK_CONTAINER (parent)) == widget)
+  if (gtk_widget_get_focus_child (parent) == widget)
     {
       child = priv->focus_widget;